package com.zpark.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
import java.util.UUID;

/**
 * @PackageName: com.zpark.springboot19fileuploadanddownload.controller
 * @ClassName: FileController
 * @Description:
 * @author: RZS           要运行时将地址修改
 * @date: 2022/10/18  16:17
 */
@RestController
public class FileController {

    /**
     * 上传文件
     * @param file 文件对象
     * @return
     */
    @PostMapping("/upload")
    public String upload(MultipartFile file){

        try {
            // 判断文件是否为null
            if (file.isEmpty()) {
                // 文件为空
                return "文件为空";
            }
            // 获取文件名字
            String fileName = file.getOriginalFilename();
            // 获取文件的后缀
            String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
            // 设置文件保存路径
            String path = "C:/upload/" + UUID.randomUUID() + "." + suffix;
            // 创建file对象保存文件
            File f = new File(path);
            // 判断文件所在目录是否存在
            if (!f.getParentFile().exists()) {
                // 目录不存在则创建目录
                f.getParentFile().mkdirs();
            }
            // 路径存在，则保存文件
            file.transferTo(f);

            return "文件上传成功";
        } catch(Exception e) {
              e.printStackTrace();
        }

        return "文件上传失败";
    }

    /**
     *  多文件上传流程
     *      1.前端上传多个文件
     *      2.后台使用请求对象(MultipartHttpServletRequest)接收整个请求流
     *      3.获取MultipartFile集合
     *      4.定义缓冲字节输出流
     *      5.遍历MultipartFile集合
     *      6.获取每一个MultipartFile对象
     *      7.定义上传路径
     *      8.判断上传文件是否为空（也就是没有上传）
     *      9.如果不为空，则通过缓冲字节输出流写入到上传路径
     */
    @PostMapping("/uploads")
    public String batchUpload(MultipartHttpServletRequest request){
        // 获取MultipartFile集合
        List<MultipartFile> files = request.getFiles("file");
        MultipartFile file = null;
        // 定义缓冲字节输出流
        BufferedOutputStream stream = null;
        // 遍历MultipartFile集合
        for (int i = 0; i < files.size(); i++) {
            // 获取每一个MultipartFile对象
            file = files.get(i);
            // 定义上传路径
            String filePath = "C:/upload/";
            // 判断上传文件是否为空（也就是没有上传）
            if (!file.isEmpty()){
                // 不为空，则通过缓冲字节输出流写入到上传路径
                try {
                    byte[] bytes = file.getBytes();
                    stream = new BufferedOutputStream(new FileOutputStream(new File(filePath+file.getOriginalFilename())));
                    stream.write(bytes);
                    stream.close();
                } catch (IOException e) {
                    stream = null;
                    return "第"+i+"个文件上传失败："+e.getMessage();
                }
            }else {
                return "第"+i+"个文件上传失败因为文件为空";
            }
        }
        return "上传成功";
    }

    /**
     * 文件下载
     * @param request
     * @param response
     * @return
     */
    @GetMapping("/download")
    public String downloadFile(HttpServletRequest request, HttpServletResponse response) {
        String fileName = "boss.jpg";// 文件名
        // 判断文件名字是否为空
        if (fileName != null) {
            //设置文件路径
            File file = new File("C:/upload/gameover.png");
            //File file = new File(realPath , fileName);
            // 判断文件所在目录是否存在
            if (file.exists()) {
                response.setContentType("application/force-download");// 设置强制下载不打开
                response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名
                byte[] buffer = new byte[1024];
                FileInputStream fis = null;
                BufferedInputStream bis = null;
                try {
                    fis = new FileInputStream(file);
                    bis = new BufferedInputStream(fis);
                    OutputStream os = response.getOutputStream();
                    int i = bis.read(buffer);
                    while (i != -1) {
                        os.write(buffer, 0, i);
                        i = bis.read(buffer);
                    }
                    return "下载成功";
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (bis != null) {
                        try {
                            bis.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (fis != null) {
                        try {
                            fis.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
        return "下载失败";
    }
}
